<?php
	/*
	* Lớp Filter hỗ trợ cho Fx_Data_Column để lọc kết quả
	* trong grid view
	*/
	if (!class_exists('Fx_Data_Column'))
	{
		require_once APP_LIBRARY_PATH . 'doc/fx_data_column.php';	
	}
	class Fx_Data_Column_Filter extends Fx_Data_Column
	{
		// Dữ liệu nguồn
		protected $_dataSource = null;	
		// Cột được gắn kết
		protected $_column = null;
		// Dữ liệu lọc
		protected $_filterData = '';
		// Kiểu lọc: text, select, datetime, dataRange
		protected $_filterType = 'text';
		// Các kiểu lọc cho trước
		protected $_allowTypes = array('text', 'select', 'datetime', 'datarange');
		// Nếu là kiểu dataRange thì áp dụng filterRange
		protected $_filterRange = array('start' => '', 'end' => '');
		// Kết quả lọc hiện thời
		protected $_filterResult = null;
		// Thiết lập bộ lọc
		protected static $_filterHelper = null;
		
		function __construct($type = '', Fx_Data_Column & $column = null)
		{
			if (!empty($type) && in_array($type, $this->_allowTypes))
			{
				$this->setFilterType($type);
			}
			if ($column != null)
			{
				$this->setColumn($column);
			}
			parent::__construct();
		}
		
		function __afterInit()
		{
			// Thiết lập ID, Class Default của column filter
			if (empty($this->_id))
			{
				$this->_id = 'defaultColumnFilter_field_';
				if ($this->_column !== null)
				{
					if (!empty($this->_column->_field))
					{
						$this->_id .= $this->_column->_field;
					}
					else
					{
						$this->_id .= time();
					}
				}
			}
			$this->addClass('columnFilter');
			if (self::$_filterHelper === null)
			{
				self::$_filterHelper = & Fx_Data_Row_Helper::getInstance();
			}
			return $this;
		}
		
		// Thiết lập cột lọc
		function setColumn(Fx_Data_Column & $column)
		{
			if ($column != null)
			{
				$this->_column = & $column;
				$model = & $column->getModel();
				if ($model != null && $model->isLoaded()) 
				{
					$this->setModel($model);
					$this->setField($column->getField());
				}
				else
				{
					return $this;	
				}
				// Khởi tạo datasource
				$collection = $model->getCollection();
				if (count($collection) > 0)
				{
					foreach ($collection as $entity)
					{
						$this->_dataSource[$entity->getId()] = $entity;	
					}
				}
				if (!empty($this->_field))
				{
					$this->setValueMember($this->_field);
				}
				if (empty($this->_displayMember))
				{
					$this->setDisplayMember($this->_valueMember);
				}
			}
			return $this;	
		}
		
		// Lấy về cột được gắn kết
		function & getColumn()
		{
			$column = & $this->_column;
			return $column;
		}
		
		// Thiết lập dữ liệu lọc
		function setFilterData($filter)
		{
			$this->_filterData = $filter;
			return $this;
		}
		
		// Lấy về dữ liệu lọc hiện thời
		function getFilterData()
		{
			return $this->_filterData;	
		}
		
		// Thiết lập kiểu lọc
		function setFilterType($type = 'text')
		{
			if (!is_string($type) || !in_array($type, $this->_allowTypes))
			{
				throw new Exception('You Must Input Type In The Allowing Types: ' . implode(', ', $this->_allowTypes));	
			}
			$this->_filterType = $type;
			return $this;
		}
		
		// Lấy về kiểu lọc
		function getFilterType()
		{			
			return $this->_filterType;
		}
		
		// Lấy về các kiểu lọc cho phép
		function & getAllowTypes()
		{
			$types = & $this->_allowTypes; 
			return $types;
		}
		
		// Reset lại bộ lọc
		function resetFilter()
		{
			$this->_filterData = '';
			$this->_filterType = 'text';
			$this->_filterRange = array('start'=>'', 'end'=>'');
			$this->_filterResult = null;
			return $this;
		}
		
		// Thiết lập datasource
		private function setDataSource($dataSource)
		{
			if ($dataSource != null)
			{
				$this->_dataSource = $dataSource;	
			}
			return $this;
		}
		
		// Lấy về dữ liệu nguồn<br>
		function getDataSource()
		{
			return $this->_dataSource;	
		}
		
		// Thiết lập khoảng lọc
		function setFilterRange($range = array())
		{
			if (isset($range['start']) && isset($range['end']))
			{
				$this->_filterRange = $range;	
			}
			return $this;
		}
		
		// Lấy về khoảng lọc
		function getFilterRange()
		{
			return $this->_filterRange;	
		}

		// filter
		function filterColumn($filterData)
		{
			if ($this->_column === null)
			{
				return $this;	
			}
			$row = & $this->_column->getRow();
			if ($this->_row === null)
			{
				return $this;	
			}
			$gridView = & $row->getDataGrid();
			if ($gridView === null)
			{
				return $this;	
			}
			$gridView->filterBy($_column->getField . ' ' . $filterData);
			return $this;
		}
		
		// Lấy về nội dung html
		public function getOutputHtml()
		{
			if ($this->_column->isVisible())
			{
				if ($this->isVisible())
				{
					$output = "<td id=\"colFilterId_$this->_field\" class=\"cellDataView columnFilter\" title=\"$this->_tooltip\" alt=\"$this->_tooltip\" colspan=\"$this->_colspan\" rowspan=\"$this->_rowspan\" width=\"$this->_width\" height=\"$this->_height\"";
					$output .= ">\n" . $this->renderOutputData();
					$output .= '</td>';
					return $output;
				}
			}
			return null;
		}
		
		public function renderOutputData()
		{
			$type = $this->getFilterType();
			switch ($type)
			{
				case 'text':
					$output = "<input type=\"text\" name=\"dataFilter_$this->_field\" class=\"dataFilter\" id=\"dataFilter_$this->_field\"/>";
				break;
				case 'select':
					$output = "<select name=\"dataFilter_$this->_field\" class=\"dataFilter\" id=\"dataFilter_$this->_field\">";
					if (count($this->_dataSource) > 0) {
						$output .= "<option value=\"-1\">-- Select An Option --</option>";
						foreach ($this->_dataSource as $data)
						{
							$getValueMember   = 'get' . ucfirst($this->_valueMember);
							$getDisplayMember = 'get' . ucfirst($this->_displayMember);
							$valueMember   = $data->$getValueMember();
							$displayMember = $data->$getDisplayMember();
							$output .= "<option value=\"$valueMember\">$displayMember</option>";
						}
					} 
					else
					{
						$value = $this->getData();
						$output .= "<option value=\"$value\">$value</option>";;
					}
					$output .= "</select>";
				break;
				default:
					$output = "<input type=\"text\" name=\"dataFilter_$this->_field\" class=\"dataFilter\" id=\"dataFilter_$this->_field\"/>";
				break;
			}
			return $output;
		}
	}
?>